package net.jgrm.common.util;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * Bean转换工具类
 * 提供简单的对象属性复制功能
 *
 * @author service-common
 */
public class BeanUtils {

    /**
     * 私有构造函数
     */
    private BeanUtils() {
        // 工具类不允许实例化
    }

    /**
     * 复制对象属性
     *
     * @param source 源对象
     * @param target 目标对象
     */
    public static void copyProperties(Object source, Object target) {
        if (source == null || target == null) {
            return;
        }

        Field[] sourceFields = source.getClass().getDeclaredFields();
        Field[] targetFields = target.getClass().getDeclaredFields();

        for (Field sourceField : sourceFields) {
            for (Field targetField : targetFields) {
                if (sourceField.getName().equals(targetField.getName())
                        && sourceField.getType() == targetField.getType()) {
                    try {
                        sourceField.setAccessible(true);
                        targetField.setAccessible(true);
                        Object value = sourceField.get(source);
                        targetField.set(target, value);
                    } catch (IllegalAccessException e) {
                        // 忽略无法访问的字段
                    }
                }
            }
        }
    }

    /**
     * 转换对象类型
     *
     * @param source      源对象
     * @param targetClass 目标类型
     * @return 转换后的对象
     */
    public static <T> T convert(Object source, Class<T> targetClass) {
        if (source == null || targetClass == null) {
            return null;
        }

        try {
            T target = targetClass.newInstance();
            copyProperties(source, target);
            return target;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 转换列表中的对象类型
     *
     * @param sourceList  源列表
     * @param targetClass 目标类型
     * @return 转换后的列表
     */
    public static <T> List<T> convertList(List<?> sourceList, Class<T> targetClass) {
        if (sourceList == null || sourceList.isEmpty() || targetClass == null) {
            return Collections.emptyList();
        }

        List<T> targetList = new ArrayList<>();
        for (Object source : sourceList) {
            T target = convert(source, targetClass);
            if (target != null) {
                targetList.add(target);
            }
        }
        return targetList;
    }
}